package package_monster;

import java.util.*;
public class SmartStrategy implements Strategy {
	private ArrayDeque<Integer> queueX = new ArrayDeque<Integer>(1000);
	private ArrayDeque<Integer> queueY = new ArrayDeque<Integer>(1000); //������� � ������������ ������ ������� ����� ������
	/*
	 * (Javadoc)
	 * �������� ��������������� ������ numerator �������� ����������� ����� �� ������ ������
	 * @author StrategyTeam
	 * @param map[][] ������ ���������
	 * @param xMonster, yMonster ��������� �������
	 * @param xPacman, yPacman ���������� �������
	 * @param current ����� �������� ���� ���������(�� �� ����� ����� �� ������ ������)
	 * @param numerator ��������������� ������ ���������� ����� �� ������ ������
	 * @return ����� ���������� ����
	 */
	public int CurrentsStep(int xMonster,int yMonster,int xPacman,int yPacman,Thing map[][],int current,int numerator[][])
	{
		Wall wall = new Wall();
		current++; //������� �����
		//��������� ���� �� ������ � �������� ������� � �� ���� �� �� � ���
		if(map[xMonster][yMonster-1].getClass().getName() != wall.getClass().getName() && numerator[xMonster][yMonster-1] == -1)
		{
			queueX.add(xMonster); //��������� � ������� ������
			queueY.add(yMonster-1);
			numerator[xMonster][yMonster-1]=current; //�������� ������
		}
		if(map[xMonster][yMonster+1].getClass().getName() != wall.getClass().getName() && numerator[xMonster][yMonster+1] == -1)
		{
			queueX.add(xMonster); 
			queueY.add(yMonster+1);
			numerator[xMonster][yMonster+1] = current;
		}
		if(map[xMonster-1][yMonster].getClass().getName() != wall.getClass().getName() && numerator[xMonster-1][yMonster] == -1)
		{
			queueX.add(xMonster-1);
			queueY.add(yMonster);
			numerator[xMonster-1][yMonster ] = current;
		}
		if(map[xMonster+1][yMonster].getClass().getName() != wall.getClass().getName() && numerator[xMonster+1][yMonster-1] == -1)
		{
			queueX.add(xMonster+1);
			queueY.add(yMonster);
			numerator[xMonster+1][yMonster] = current;
		}
		return current;
	}
	/*
	 * (Javadoc)
	 * ���������� ����������� �������� �������
	 * @author StrategyTeam
	 * @param map[][] ������ ���������
	 * @param xMonster, yMonster ��������� �������
	 * @param xPacman, yPacman ���������� �������
	 * @return �������� �� 0 �� 3, ���
	 *         0 - �������� �����
	 *         1 - �������� ������
	 *         2 - �������� ����
	 *         3 - �������� �����
	 */
	public int SelectDirection(Thing map[][], int xMonster, int yMonster, int xPacman, int yPacman)
	{
		queueX.add(xMonster);
		queueY.add(yMonster); //��������� ��������� ����� � ������� ������
		int current=0; //������� ����� -1 �������� ��� � ���� ������ ��� �� ����
		int n = map[1].length;
		int numerator[][] = new int [map.length][n]; 
		for (int i = 0;i<map.length;i++)
		{
			for (int j = 0;j<map.length;j++)
			{
				numerator[i][j] = -1;
			}
		}
		numerator[xMonster][yMonster]=0; //��������� �������
		while(!queueX.isEmpty()) //���� ���� ������ � ������� �� �� ����
			{
			if(queueX.peek() == xPacman && queueY.peek() == yPacman) 
				{
				break; //����� ���������� ���� � �������
				}
			current = CurrentsStep(queueX.poll(),queueY.poll(),xPacman,yPacman,map,current,numerator); //����� ��������� ������
			}
		int i = xPacman;
		int j = yPacman;
		
		while (numerator[i][j]!=1) //���� �������
		{
			if (numerator[i][j] == numerator[i][j-1]+1)
				{
				j--;
				}
			if (numerator[i][j] == numerator[i][j+1]+1)
				{
				j++;
				}
			if (numerator[i][j] == numerator[i-1][j]+1)
				{
				i--;
				}
			if (numerator[i][j] == numerator[i+1][j]+1)
				{
				i++;
				}
		} 
		//����������� � ����� ������� ������������ ��������� ������ ���������
		if (numerator[i][j-1] == 0)
			{
			return 0; //�����
			}
		if (numerator[i-1][j] == 0) 
			{
			return 1; //������
			}
		if (numerator[i][j+1] == 0) 
			{
			return 2; //����
			}
		if (numerator[i+1][j] == 0)
			{
			return 3; //�����
			}
		return -1;
	}
	
	
}

